package com.java.File;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class FileAPI {
    public static void main(String[] args) throws IOException {
        String childPath = "students.txt";
        String parentPath = "E:\\WordSpace_IDEA\\Java\\File和IO流\\com\\java\\files";
        String relativePath = "File和IO流\\com\\java\\files\\students.txt"; // 相对当前项目
        String absolutePath = "E:\\WordSpace_IDEA\\Java\\File和IO流\\com\\java\\files\\students.txt";

        // 常量
        System.out.println(File.pathSeparator); // ;
        System.out.println(File.pathSeparatorChar); // ;
        System.out.println(File.separator); // \
        System.out.println(File.separatorChar); // \

        // 创建对象
        File file1 = new File(relativePath);
        System.out.println(file1); // File和IO流\com\java\files\students.txt
        File file2 = new File(absolutePath);
        System.out.println(file2); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt
        File file3 = new File(parentPath, childPath);
        System.out.println(file3); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt
        File file4 = new File(new File(parentPath), childPath);
        System.out.println(file4); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt

        // exists：判断路径是否存在
        System.out.println(new File(childPath).exists()); // false
        System.out.println(new File(parentPath).exists()); // true
        System.out.println(new File(absolutePath).exists()); // true
        System.out.println(new File(relativePath).exists()); // true

        // isDirectory：判断路径是否为文件夹
        System.out.println(new File(childPath).isDirectory()); // false
        System.out.println(new File(parentPath).isDirectory()); // true
        System.out.println(new File(absolutePath).isDirectory()); // false
        System.out.println(new File(relativePath).isDirectory()); // false

        // isFile：判断路径是否为文件
        System.out.println(new File(childPath).isFile()); // false
        System.out.println(new File(parentPath).isFile()); // false
        System.out.println(new File(absolutePath).isFile()); // true
        System.out.println(new File(relativePath).isFile()); // true

        // 改变条件获取不同执行效果
        if (false) {
            // createNewFile：创建新的空文件，返回值表示文件是否创建成功。若父路径不存在则抛出异常IOException
            System.out.println(new File(parentPath + "\\teachers.txt").createNewFile()); // true
            System.out.println(new File(parentPath + "\\teachers.txt").createNewFile()); // false

            // mkdir：创建单级文件夹，返回值表示单级文件夹是否创建成功。若父路径不存在则创建失败
            System.out.println(new File(parentPath + "\\file1").mkdir()); // true
            System.out.println(new File(parentPath + "\\file1").mkdir()); // false
            System.out.println(new File(parentPath + "\\file1\\file2\\file3").mkdir()); // false

            // mkdirs：创建多级文件夹，返回值表示多级文件夹是否创建成功。也可以创建单级文件夹
            System.out.println(new File(parentPath + "\\file1\\file2").mkdirs()); // true
            System.out.println(new File(parentPath + "\\file1\\file2").mkdirs()); // false
        } else {
            // delete：删除文件或空文件夹，且删除之后无法利用回收站恢复，返回值表示文件或空文件夹是否删除成功
            System.out.println(new File(parentPath + "\\teachers.txt").delete()); // true
            System.out.println(new File(parentPath + "\\teachers.txt").delete()); // false
            System.out.println(new File(parentPath + "\\file1").delete()); // false
            System.out.println(new File(parentPath + "\\file1\\file2").delete()); // true
            System.out.println(new File(parentPath + "\\file1").delete()); // true
        }

        // length：获取文件的大小，单位为字节。无法获取文件夹的大小
        System.out.println(new File(childPath).length()); // 0
        System.out.println(new File(parentPath).length()); // 4096
        System.out.println(new File(absolutePath).length()); // 9
        System.out.println(new File(relativePath).length()); // 9

        // lastModified：获取文件或文件夹的最后修改毫秒值
        System.out.println(new File(childPath).lastModified()); // 0
        System.out.println(new File(parentPath).lastModified()); // 1710164881542
        System.out.println(new File(absolutePath).lastModified()); // 1710164768336
        System.out.println(new File(relativePath).lastModified()); // 1710164768336

        // getAbsolutePath：获取文件或文件夹的绝对路径
        System.out.println(new File(childPath).getAbsolutePath()); // E:\WordSpace_IDEA\Java\students.txt
        System.out.println(new File(parentPath).getAbsolutePath()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files
        System.out.println(new File(absolutePath).getAbsolutePath()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt
        System.out.println(new File(relativePath).getAbsolutePath()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt

        // getPath：获取构造File时的路径
        System.out.println(new File(childPath).getPath()); // students.txt
        System.out.println(new File(parentPath).getPath()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files
        System.out.println(new File(absolutePath).getPath()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files\students.txt
        System.out.println(new File(relativePath).getPath()); // File和IO流\com\java\files\students.txt

        // getParent：获取构造File时的父路径
        System.out.println(new File(childPath).getParent()); // null
        System.out.println(new File(parentPath).getParent()); // E:\WordSpace_IDEA\Java\File和IO流\com\java
        System.out.println(new File(absolutePath).getParent()); // E:\WordSpace_IDEA\Java\File和IO流\com\java\files
        System.out.println(new File(relativePath).getParent()); // File和IO流\com\java\files

        // getName：获取文件或文件夹名称，带后缀
        System.out.println(new File(childPath).getName()); // students.txt
        System.out.println(new File(parentPath).getName()); // files
        System.out.println(new File(absolutePath).getName()); // students.txt
        System.out.println(new File(relativePath).getName()); // students.txt

        // listFiles：获取当前路径下所有文件或文件夹的File，隐藏的文件也可以被获取。当路径不存在或路径表示文件或无权限时返回null
        File[] files = new File(parentPath).listFiles();
        System.out.println(Arrays.toString(Arrays.stream(files).map(item -> item.getName()).toArray())); // [file1, students.txt, teachers.txt]
        File[] filesFilter1 = new File(parentPath).listFiles(pathname -> pathname.getName().endsWith(".txt"));
        System.out.println(Arrays.toString(Arrays.stream(filesFilter1).map(item -> item.getName()).toArray())); // [students.txt, teachers.txt]
        File[] filesFilter2 = new File(parentPath).listFiles((dir, name) -> name.endsWith(".txt"));
        System.out.println(Arrays.toString(Arrays.stream(filesFilter2).map(item -> item.getName()).toArray())); // [students.txt, teachers.txt]

        // list：获取当前路径下所有文件或文件夹的名称，隐藏的文件也可以被获取。当路径不存在或路径表示文件或无权限时返回null
        String[] list = new File(parentPath).list();
        System.out.println(Arrays.toString(list)); // [file1, students.txt, teachers.txt]
        String[] listFilter = new File(parentPath).list((dir, name) -> name.endsWith(".txt"));
        System.out.println(Arrays.toString(listFilter)); // [students.txt, teachers.txt]

        // listRoots：获取系统中可用的文件系统根盘符的File
        File[] roots = File.listRoots();
        System.out.println(Arrays.toString(roots)); // [C:\, D:\, E:\, F:\]
    }
}
